package com.excilys.gwtfirst.domain.model.constraints;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class UserPasswordValidator implements ConstraintValidator<UserPassword, String> {

	private Condition[] conditions;

	@Override
	public void initialize(UserPassword constraintAnnotation) {
		conditions = constraintAnnotation.conditions();
	}

	@Override
	public boolean isValid(final String password, ConstraintValidatorContext constraintContext) {
		if (password == null)
			return false;

		for (Condition c : conditions) {
			if (count(c.target().pattern, password) < c.nb())
				return false;
		}
		return true;
	}

	/**
	 * Compte le nombre d'occurence d'un caractère dans une chaine
	 * 
	 * @param character le caractère à compter
	 * @param string la chaine qui le contient
	 * @return le nombre de fois que le caractère apparaît dans la chaine, 0 si
	 *         il n'apparaît pas
	 */
	protected int count(String substring, final String string) {
		return string.replaceAll("[^" + substring + "]", "").length();
	}
}
